/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package villapancha2011;

import java.util.List;
import java.util.LinkedList;
import java.util.Random;

import org.javahispano.javacup.modelo.*;

/**
 *
 * @author Jorgeao
 */
public class Arquera extends VillaPanchaBase {

    public Arquera(TacticaVillaPancha2011 t) {
        super(t);
    }

    void arquera() {
        // Si la Rava puede rematar hay varias opciones
        // -> Si hay rivales que pueden rematar en un principio que la mande al demonio
        // -> Si hay rivales muy cerca tiene que despejar tratando de esquivarlos
        // -> Si no hay rivales cerca puede buscar mandar un pase a la mitad de la cancha en la zona que haya menos rivales
        if (tactica.grossoPuedeRematar(Grosso.Rava)) {
            // Busco la distancia de los rivales a la Rava, si hay alguno muy cerca calculo para dónde tirarla, sino
            // despejo a cara de can
            int[] rivalesAEsquivar = tactica.rivalesCercanos(situacionPartido().balon(), 5);
            if (tactica.rivalesPuedenRematar() || rivalesAEsquivar.length == 0) {
                // Despejar al demonio
                tactica.comandos.add(new ComandoGolpearBalon(Grosso.Rava.ordinal(), Constantes.centroArcoSup, 1, true));
            } else {
                // Es fácil demostrar que si le pego con el angulo maximo, los rivales muy cercanos no la deben agarrar
                // solo hay una franja en la que debo tener cuidado, y es si están más cerca que 2.4 metros o más lejos de 3.5 con las constantes dadas

                // Por defecto le pegamos con el ángulo vertical máximo si tenemos rivales cercanos
                double anguloFinal = Constantes.ANGULO_VERTICAL_MAX;
                // Calculamos los metros que recorrerá el balón hasta la próxima iteración
                double distanciaProximaIteracion = Constantes.getVelocidadRemate(tactica.detalle.getJugadores()[Grosso.Rava.ordinal()].getRemate());
                // Ahora la distancia máxima en que un rival puede golpear el esférico sin que le pase por arriba 'e la capocha
                double anguloEnRad = Math.toRadians(Constantes.ANGULO_VERTICAL_MAX);
                double hipotenusa = Constantes.ALTURA_CONTROL_BALON / Math.sin(anguloEnRad);
                double distanciaMaxRivales = Math.sqrt(Math.pow(hipotenusa, 2) - Math.pow(Constantes.ALTURA_CONTROL_BALON, 2));

                if (tactica.rivalesCercanos(situacionPartido().balon(), distanciaProximaIteracion, distanciaMaxRivales).length == 0) {
                    tactica.comandos.add(new ComandoGolpearBalon(Grosso.Rava.ordinal(), Constantes.centroArcoSup, 1, anguloFinal));
                } else {
                    // Agrego esto, pero para la edición 2011 de la javacup no va a pasar nunca
                    tactica.comandos.add(new ComandoGolpearBalon(Grosso.Rava.ordinal(), Constantes.centroArcoSup, 1, true));
                }
            }
        } else {
            int[] masCercanos = situacionPartido().getRecuperacionBalon();
            // Hay casos que no devuelve datos en el array, por eso hay que chequear siempre
            if (masCercanos.length > 1) {
                double[] destino = situacionPartido().getTrayectoria(masCercanos[0]);
                Posicion destPos = new Posicion(destino[0], destino[1]);
                // Si la pelota va a un radio menor o igual del ancho del área grande le salgo a lo Seba Sosa
                if (Constantes.centroArcoInf.distancia(destPos) < Constantes.ANCHO_AREA_GRANDE) {
                    tactica.comandos.add(new ComandoIrA(Grosso.Rava.ordinal(), destPos));
                } else if (masCercanos[1] == Grosso.Rava.ordinal() && !situacionPartido().saco()) {
                    // buscar la ecuacion de la recta del arco y la pelota
                    double destinoX = 0;
                    if (Math.abs(destPos.getX() - situacionPartido().balon().getX()) > 0.1) {
                        double m = (destPos.getY() - situacionPartido().balon().getY()) / (destPos.getX() - situacionPartido().balon().getX());
                        double b = destPos.getY() - m * destPos.getX();

                        destinoX = (-Constantes.LARGO_CAMPO_JUEGO / 2 - b) / m;
                        if (destinoX < Constantes.posteIzqArcoInf.getX()) {
                            destinoX = Constantes.centroArcoInf.getX();
                        } else if (destinoX > Constantes.posteDerArcoInf.getX()) {
                            destinoX = Constantes.centroArcoInf.getX();
                        }
                    }
                    Posicion p = new Posicion(destinoX, situacionPartido().misJugadores()[Grosso.Rava.ordinal()].getY());
                    tactica.comandos.add(new ComandoIrA(Grosso.Rava.ordinal(), p));

                } else {
                    tactica.comandos.add(new ComandoIrA(Grosso.Rava.ordinal(), tactica.alineacionActual[Grosso.Rava.ordinal()]));
                }
            } else {
                // TODO: Ver si entra acá en situaciones riesgosas, si es así hay que hacer otra cosa
                tactica.comandos.add(new ComandoIrA(Grosso.Rava.ordinal(), tactica.alineacionActual[Grosso.Rava.ordinal()]));
            }
        }

        // Que mas nadie la toque, solo es de Nico :P
        MarcarGrossoUtilizado(Grosso.Rava);

    }

}
